package main

import (
	"bufio"
	"fmt"
	"os"
	"strings"

	"github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
	Use:   "main",
	Short: "成语接龙CLI小游戏",
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("输入 play 开始游戏，输入 exit 退出程序。")
	},
}

var playCmd = &cobra.Command{
	Use:   "play",
	Short: "开始游戏",
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Println("游戏开始！输入四字成语进行接龙，输入 help 获取可以接龙的成语，输入 exit 退出游戏。")
		playGame()
	},
}

var idioms []string

func init() {
	rootCmd.AddCommand(playCmd)
	loadIdioms()
}

func main() {
	if err := rootCmd.Execute(); err != nil {
		fmt.Println(err)
		os.Exit(1)
	}
}

func loadIdioms() {
	file, err := os.Open("idioms.txt")
	if err != nil {
		fmt.Println("无法打开成语库文件:", err)
		os.Exit(1)
	}
	defer func(file *os.File) {
		err := file.Close()
		if err != nil {
			panic(err)
		}
	}(file)

	scanner := bufio.NewScanner(file)
	for scanner.Scan() {
		idioms = append(idioms, scanner.Text())
	}
	if err := scanner.Err(); err != nil {
		fmt.Println("读取成语库文件时出错:", err)
		os.Exit(1)
	}
}

func playGame() {
	reader := bufio.NewReader(os.Stdin)
	var inputRunes []rune
	var lastChar string
	for {
		fmt.Print("请输入一个四字成语：")
		input, _ := reader.ReadString('\n')
		input = strings.TrimSpace(input)

		if input != "help" {
			inputRunes = []rune(input)
			lastChar = string(inputRunes[len(inputRunes)-1])
		}
		if input == "exit" {
			fmt.Println("游戏结束，谢谢参与！")
			break
		} else if input == "help" {

			fmt.Println("可以接龙的成语列表：")
			for _, idiom := range idioms {
				if strings.HasPrefix(idiom, lastChar) {
					fmt.Println(idiom)
				}
			}
			continue
		}

		valid := false
		for _, idiom := range idioms {
			if idiom == input {
				valid = true
				break
			}
		}

		if !valid {
			fmt.Println("输入的不是成语，请重新输入！")
			continue
		}

		nextValid := false
		for _, idiom := range idioms {
			if strings.HasPrefix(idiom, lastChar) {
				nextValid = true
				break
			}
		}

		if !nextValid {
			fmt.Println("无法接龙，游戏结束！")
			break
		}
	}
}
